use modular_bitfield::prelude::*;

#[bitfield]
#[repr(u8)] // 明确指定内存布局
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct SwitchFlag {
    error: bool,     // bit 0 (1位)
    state: bool,     // bit 1 (1位)
    min_value: bool, // bit 2 (1位)
    quadrant: B5,   // bits 3-7 (5位)
}

// //字节级访问方法
// impl SwitchFlag {
//     pub fn from_byte(byte: u8) -> Self {
//         Self::from_bytes(byte.to_ne_bytes())
//     }

//     pub fn to_byte(&self) -> u8 {
//         u8::from_ne_bytes(self.into_bytes())
//     }
// }

fn main() {
    // 构造对象
    let mut flag = SwitchFlag::new()
        .with_error(true)
        .with_state(false)
        .with_min_value(true)
        .with_quadrant(0x1A.into()); // 26 (5 bits 最大值31)

    // 读取字段
    println!("Error: {}", flag.error());     // true
    println!("State: {}", flag.state());     // false
    println!("MinValue: {}", flag.min_value()); // true
    println!("Quadrant: {}", flag.quadrant()); // 26

    // 修改字段
    flag.set_state(true);
    flag.set_quadrant(10);

    // 读取字段
    println!("Error: {}", flag.error());     // true
    println!("State: {}", flag.state());     // false
    println!("MinValue: {}", flag.min_value()); // true
    println!("Quadrant: {}", flag.quadrant()); // 26

    // 字节级访问
    let byte = flag.into_bytes();
    println!("Full byte: 0x{:02x}", byte[0]); // 0xCD

    // let new_flag = SwitchFlag::from_byte(0x7F);
    // println!("New quadrant: {}", new_flag.quadrant()); // 15
}
